package com.jpa.lgt.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * @author lgt
 * @time 2018/11/27
 * @description： 1.构建一对主从线程组
 * 2.定义服务器启动类
 * 3.为服务器设置channel
 * 4.设置处理从线程池的助手类初始化器
 * 5.监听启动和关闭服务器
 */
public class HelloServer {

    public static void main(String[] args) throws Exception{


            //1.定义一对线程组

            //主线程组， 用于接收客户端的连接，但不做任何处理，指挥子线程组做事
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            //子线程组，主线程组将任务指派给子线程组，让它去处理
            EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            //2. 定义服务器启动类

            //netty服务器的创建，ServerBootstrap是一个启动类
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup)                           //设置主从线程组
                    .channel(NioServerSocketChannel.class)                          //设置nio的双向通道
                    .childHandler(new HelloServerInitializer());                    //子处理器，用于处理workerGroup传递的任务

            //5.监听启动和关闭服务器

            //启动server,并且设置8000为启动的端口号，同时启动的方式为同步
            ChannelFuture channelFuture = serverBootstrap.bind(8087).sync();
            //监听关闭的channel，设置为同步方式
            channelFuture.channel().closeFuture().sync();

        }finally {
            //关闭主从线程组
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();

        }


    }
}
